﻿using LM.InterfacesFabricas.Basicos.Enumeradores;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Excecoes;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces.Servicos;

using NUnit.Framework;

namespace LM.TesteUnitario
{
    [TestFixture]
    class TesteServicoDeTelefone
    {
        private IServicoDeTelefone _servicoDeTelefone;

        [SetUp]
        public void SetUp()
        {
            _servicoDeTelefone = FabricaGenerica.Crie<IServicoDeTelefone>();
        }

        [TestFixtureTearDown]
        public void TestFixtureTearDown()
        {
            LimpeDados();
        }

        [Test]
        public void TesteCadastreComSucesso()
        {
            LimpeDados();
            var dtoTelefone = new DtoTelefone { Codigo = 999, Ddd = 62, Numero = "3232-3232", TipoDeTelefone = EnumTipoDeTelefone.Celular};

            _servicoDeTelefone.Cadastre(dtoTelefone);
        }

        private void LimpeDados()
        {
            var servicoDeTelefone = FabricaGenerica.Crie<IServicoDeTelefone>();

            var Telefone = servicoDeTelefone.Consulte(999);
            if (Telefone != null)
            {
                servicoDeTelefone.Exclua(Telefone.Codigo);
            }
        }

        [Test]
        [ExpectedException(typeof(InconsistenciasException))]
        public void TesteCadastreComInconsistencia()
        {
            var dtoTelefone = new DtoTelefone { Codigo = 1, Ddd = 0, Numero = "1", TipoDeTelefone = EnumTipoDeTelefone.Celular};

            _servicoDeTelefone.Cadastre(dtoTelefone);
        }

        [Test]
        public void TesteAtualizeComSucesso()
        {
            LimpeDados();
            InicializeDados();
            const string novoTipo = "Celular";

            var Telefone = _servicoDeTelefone.Consulte(999);
            Telefone.TipoDeTelefone = EnumTipoDeTelefone.Celular;
            _servicoDeTelefone.Atualize(Telefone);

            Telefone = _servicoDeTelefone.Consulte(999);
            Assert.AreEqual(novoTipo, Telefone.TipoDeTelefone);
        }

        [Test]
        public void TesteExcluaComSucesso()
        {
            LimpeDados();
            InicializeDados();

            var Telefone = _servicoDeTelefone.Consulte(999);
            Assert.IsNotNull(Telefone);
            Assert.AreEqual(999, Telefone.Codigo);

            _servicoDeTelefone.Exclua(999);
            Telefone = _servicoDeTelefone.Consulte(999);

            Assert.IsNull(Telefone);
        }

        [Test]
        public void TesteConsulteTodosComSucesso()
        {
            LimpeDados();
            InicializeDados();

            Assert.Greater(FabricaGenerica.Crie<IServicoDeTelefone>().ConsulteTodos().Count, 0);
        }

        private void InicializeDados()
        {
            FabricaGenerica.Crie<IServicoDeTelefone>().Cadastre(new DtoTelefone
            {
                Codigo = 999,
                Numero = "1",
                Ddd = 62,
                TipoDeTelefone = EnumTipoDeTelefone.Celular
            });
        }
    }
}
